package today.belief.mole.api;

import lombok.Data;

/**
 * @Author LXH
 * @Date 2021/7/8
 * @Description 全局响应对象
 */
@Data
public class RestResponse<T> {

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 状态码释义
     */
    private String explanation;

    /**
     * 返回结果的详细描述
     */
    private String message;

    /**
     * 业务数据
     */
    private T data;

    /**
     * 构造方法：构造一个返回体，包含默认成功状态码和默认成功状态对应的描述信息，并且有必要的业务数据对象
     *
     * @param data 数据对象
     */
    private RestResponse(T data) {
        this.code = Status.ApiStatus.SUCCESS.code();
        this.explanation = Status.ApiStatus.SUCCESS.explanation();
        this.data = data;
    }

    /**
     * 构造方法：构造一个返回体，包含状态码和状态对应的描述信息
     *
     * @param status 状态信息对象
     */
    private RestResponse(Status status) {
        this.code = status.code();
        this.explanation = status.explanation();
        this.message = status.message();
    }

    /**
     * 构造一个返回体，包含默认成功状态码和默认成功状态对应的描述信息
     */
    public static <T> RestResponse<T> success() {
        return new RestResponse<>(Status.ApiStatus.SUCCESS);
    }

    /**
     * 构造一个返回体，包含默认成功状态码和默认成功状态对应的描述信息，并且有必要的业务数据对象
     *
     * @param data 数据对象
     */
    public static <T> RestResponse<T> success(T data) {
        return new RestResponse<>(data);
    }

    /**
     * 构造一个返回体，包含默认失败状态码和默认失败状态对应的描述信息
     */
    public static <T> RestResponse<T> failed() {
        return new RestResponse<>(Status.ApiStatus.FAILED);
    }

    /**
     * 构造一个返回体，只包含状态码和状态对应的描述信息
     *
     * @param status 状态信息对象
     */
    public static <T> RestResponse<T> status(Status status) {
        return new RestResponse<>(status);
    }
}
